package org.springmvc.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springmvc.pagination.Page;
import org.springmvc.pagination.PageUtill;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

/**
 * 工具类
 * 
 * @author 唐家林
 * @time 2015年5月26日
 */
public class JsonUtil {

	private static final JsonConfig jsonConfig = new JsonConfig();
	static {
		jsonConfig.registerJsonValueProcessor(Timestamp.class, new JsonValueProcessor() {
			private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			@Override
			public Object processArrayValue(Object value, JsonConfig jsonConfig) {
				String[] obj = {};
				if (value instanceof Date[]) {
					Date[] dates = (Date[]) value;
					int size = dates.length;
					obj = new String[size];
					for (int i = 0; i < size; i++) {
						obj[i] = dateFormat.format(dates[i]);
					}
				}
				return obj;
			}

			@Override
			public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
				if (value instanceof Date) {
					return dateFormat.format((Date) value);
				}
				return value;
			}
		});
	}

	private JsonUtil() {}

	/**
	 * 验证字符串是否为空
	 * 
	 * @param str 验证的字符串
	 * @return 如果str==null或者长度为0或者在忽略大小写情况下为"null"返回true<br>
	 *         其余情况返回false
	 */
	public static boolean isNull(String str) {
		return (str == null || str.isEmpty() || str.equalsIgnoreCase("null"));
	}

	/**
	 * <p>
	 * 将指定内容转换成 包含回调函数的JSON格式
	 * </p>
	 * 如果回调函数jsonCallback为空则不加回调函数
	 * 
	 * @param str 转换内容
	 * @param jsonCallback 回调函数
	 * @return 返回转换结果
	 */
	public static String objectToJson(String str, String jsonCallback) {
		if (isNull(jsonCallback)) {
			return str;
		}
		return jsonCallback + "(" + str + ")";
	}

	/**
	 * <p>
	 * 将指定内容转换成 包含回调函数的JSON格式
	 * </p>
	 * 如果回调函数jsonCallback为空则不加回调函数
	 * 
	 * @param flag 转换内容
	 * @param jsonCallback 回调函数
	 * @return 返回转换结果
	 */
	public static String objectToJson(Boolean flag, String jsonCallback) {
		String json = Boolean.toString((flag == null ? false : flag));
		if (isNull(jsonCallback)) {
			return json;
		}
		return jsonCallback + "(" + json + ")";
	}

	/**
	 * <p>
	 * 将指定内容转换成 包含回调函数的JSON格式
	 * </p>
	 * 如果回调函数jsonCallback为空则不加回调函数
	 * 
	 * @param con 转换内容
	 * @param jsonCallback 回调函数
	 * @return 返回转换结果
	 */
	public static String objectToJson(Collection<?> con, String jsonCallback) {
		String json = JSONArray.fromObject(con, jsonConfig).toString();
		if (isNull(jsonCallback)) {
			return json;
		}
		return jsonCallback + "(" + json + ")";
	}

	/**
	 * <p>
	 * 将指定内容转换成 包含回调函数的JSON格式
	 * </p>
	 * 如果回调函数jsonCallback为空则不加回调函数
	 * 
	 * @param obj 转换内容
	 * @param jsonCallback 回调函数
	 * @return 返回转换结果
	 */
	public static String objectToJson(Object obj, String jsonCallback) {
		String json = JSONObject.fromObject(obj, jsonConfig).toString();
		if (isNull(jsonCallback)) {
			return json;
		}
		return jsonCallback + "(" + json + ")";
	}

	/**
	 * <p>
	 * 将指定内容转换成 包含回调函数的JSON格式
	 * </p>
	 * 如果回调函数jsonCallback为空则不加回调函数
	 * 
	 * @param page 转换内容
	 * @param request HttpServletRequest
	 * @param jsonCallback 回调函数
	 * @return 返回转换结果
	 */
	public static String objectToJson(Page<?> page, HttpServletRequest request, String jsonCallback) {
		return objectToJson(PageUtill.getPageResponse(page, request), jsonCallback);
	}

}
